//
// Created by last on 2025/9/11.
//
#include "../include/Sorter.hpp"
#include <iostream>
#include <algorithm>
#include <cassert>
#include <vector>
#include <random>

using std::cout;                  // 使用标准输出
using std::vector;                // 使用标准向量容器

// 日期类，表示年-月-日，封装了日期的基本操作和合法性验证
class date
{
    int _year, _month, _day;      // 私有成员：年、月、日

public:
    // 日期构造函数，通过assert验证日期合法性
    date(int year, int month, int day)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {
        assert(month < 13);        // 验证月份不超过12

        // 复杂的日期合法性验证逻辑
        if (month % 2 == 0)        // 偶数月份
        {
            if (month < 8)         // 1-7月的偶数月
            {
                if (month == 2)    // 特殊处理2月
                {
                    // 闰年判断
                    if ((year%4==0 && year%100!=0) || year%400==0)
                        assert(day < 30);  // 闰年2月最多29天
                    assert(day < 29);      // 平年2月最多28天
                }
                assert(day < 31);  // 4,6月最多30天
            }
            else
                assert(day < 32);  // 8,10,12月最多31天
        }
        else                       // 奇数月份
        {
            if (month < 8)         // 1,3,5,7月最多30天
                assert(day < 31);
            else
                assert(day < 32);  // 9,11月最多31天
        }
    }

    // 如果当前日期晚于参数日期返回true，否则false
    bool operator>(const date& d) const
    {
        // 按年-月-日的优先级顺序比较
        if (this->_year > d._year)
            return true;
        if (this->_year == d._year)
        {
            if (this->_month > d._month)
                return true;
            if (this->_month == d._month)
            {
                if (this->_day > d._day)
                    return true;
            }
        }
        return false;
    }

    // 如果当前日期早于参数日期返回true，否则false
    bool operator<(const date& d) const
    {
        // 按年-月-日的优先级顺序比较
        if (this->_year < d._year)
            return true;
        if (this->_year == d._year)
        {
            if (this->_month < d._month)
                return true;
            if (this->_month == d._month)
            {
                if (this->_day < d._day)
                    return true;
            }
        }
        return false;
    }

    // 声明友元输出运算符
    friend std::ostream& operator<<(std::ostream& out, const date& d);
};

// 实现date类输出运算符
std::ostream& operator<<(std::ostream& out, const date& d)
{
    out << '{' << d._year << ',' << d._month << ',' << d._day << '}';
    return out;
}

// 使用范围for循环打印所有元素，每个元素后跟空格，最后换行
template<typename arr>
void print(arr& a)
{
    for (const auto &i : a)
        cout << i << ' ';
    cout << '\n';
}

// 测试Sorter类对各种数据类型的排序功能，并与std::sort的结果进行对比
int main()
{
    system("chcp 65001");
    // 测试1: 整数数组排序对比
    int arr1[] = {19, 13, 12, 16, 11, 14, 12, 11, 21, 25, 27, 28, 23, 10, 26, 20};
    int arr2[] = {19, 13, 12, 16, 11, 14, 12, 11, 21, 25, 27, 28, 23, 10, 26, 20};  // 用于std::sort对比的副本

    Sorter st1(arr1);           // 创建Sorter对象对arr1排序
    st1.sort();                 // 执行排序
    print(arr1);                // 打印Sorter排序结果

    std::sort(arr2, arr2 + 16);  // 使用标准库排序
    print(arr2);                // 打印std::sort排序结果

    // 测试2: 整数向量排序对比
    vector arr3 = {5, 6, 3, 8, 6, 9, 1, 0, 2, 5};
    vector arr4 = arr3;         // 创建副本用于对比

    Sorter st2(arr3);
    st2.sort(SortOrder::DESC);
    print(arr3);

    std::sort(arr4.begin(), arr4.end());
    print(arr4);

    // 测试3: 浮点数数组排序对比
    float arr5[] = {1.2, 4.4, 2.8, 3.2, 0.9, 1.0};
    float arr6[] = {1.2, 4.4, 2.8, 3.2, 0.9, 1.0};

    Sorter st3(arr5);
    st3.sort();
    print(arr5);

    std::sort(arr6, arr6 + 6);
    print(arr6);

    // 测试4: 浮点数向量排序对比
    vector arr7 = {1.2, 4.4, 2.8, 3.2, 0.9, 1.0};
    vector arr8 = arr7;

    Sorter st4(arr7);
    st4.sort();
    print(arr7);

    std::sort(arr8.begin(), arr8.end());
    print(arr8);

    // 测试5: 自定义日期类排序对比
    vector arr10 = {
        date(1700, 11, 22), date(2011, 4, 12), date(1700, 6, 24),
        date(1992, 8, 15), date(2011, 4, 11), date(2000, 1, 14)
    };
    vector arr11 = arr10;

    Sorter st5(arr10);
    st5.sort();
    print(arr10);

    std::sort(arr11.begin(), arr11.end());  // 依赖date类的<运算符
    print(arr11);

    // 测试6: 字符数组排序对比
    char arr12[] = "adfwaGASZDF123";
    char arr13[] = "adfwaGASZDF123";

    Sorter st6(arr12);
    st6.sort();
    print(arr12);

    std::sort(arr13, arr13 + 14);  // 对C风格字符串排序
    print(arr13);

    // 测试7: 不同容器类型数组排序对比
    std::array<double, 6> arr14 = {3.14, 1.41, 2.71, 0.57, 1.73};
    std::array<double, 6> arr15 = arr14;

    Sorter st7(arr14);
    st7.sort();
    print(arr14);

    std::sort(arr15.begin(), arr15.end());
    print(arr15);

    cout << "升序检查: " << (st1.is_asc_sorted() ? "是" : "否") << '\n';
    cout << "降序检查: " << (st2.is_desc_sorted() ? "是" : "否") << '\n';
    cout << std::endl;
    return 0;
}